/* 
 * File:   FileMng.h
 * Author: Fei Fan
 * E-mail: ffinuyasha@sina.com
 * Copyright © 2013 Fei Fan, All Rights Reserved
 */


#include<stdio.h>
#include<string>
#include <stdlib.h>
#include<ctime>
#include<windows.h>  
#include <io.h>
#include<conio.h>

////////////////////////////////////////////////////////////
//
//						   宏定义
//
///////////////////////////////////////////////////////////

// big
//#define VOL_HD  512
//#define SECT_BASE  000
//#define SECT_HEADINDEX 254
//#define SECT_ROOTDIR 255
//#define SECT_VACDIR  256
//#define SECT_SYSDIR 257
//#define SECT_PSDFILE 258

//mini
#define VOL_HD  64
#define SECT_BASE  000
#define SECT_HEADINDEX 30
#define SECT_ROOTDIR 31
#define SECT_VACDIR  32
#define SECT_SYSDIR 33
#define SECT_PSDFILE 34

#define TYPE_FILE 1
#define TYPE_DIR 2
#define TYPE_NONE 0


//目标的类型：0为BaseDir 1为直接文件 2为索引块号 
//3为目录文件 4为空闲块表 5为密码文件 -1为未定义

//big
//#define FILE_MAX 32     //目录内包含文件的最大个数
//#define INDEX_MAX 32  
//#define OPEN_MAX 32
//#define STRMEMO_MAX 64   //内存中储存流的最大个数
//#define USER_MAX 32  
//#define CONTENT_MAX 2048   //一个文件的内容最大字符数
//#define SECT_MAX 4 //一个文件最多可包含的块数

//mini
#define FILE_MAX 8    //目录内包含文件的最大个数
#define INDEX_MAX 16  
#define OPEN_MAX 8
#define STRMEMO_MAX 16   //内存中储存流的最大个数
#define USER_MAX 16  
#define CONTENT_MAX 1024   //一个文件的内容最大字符数
#define SECT_MAX 4 //一个文件最多可包含的块数

//权限：
//   loadType%PMS==0 则执行
//   loadType%PMS!=0 则无权访问
//

#define NONE 5
#define READ 3
#define WRITE 2
#define RANDW 1

#define FAIL -1
#define SUCCESS 1
#define ACCESS 9999
#define NO_HD_ROOM 2

#define IS_LOCAL 1
#define IS_REMOTE -1
#define FIND_TERMINAL -1


////////////////////////////////////////////////////////////////
//
//							硬盘的数据结构
//
////////////////////////////////////////////////////////////////


//基本块
struct BaseSect
{
	short vacantSect;
	//short userSect;
	short HeadIndexSect;

};


//空闲块表
struct VacantTable
{
	short sectNum;
	short start[VOL_HD];
	short len[VOL_HD];
};



//文件头的索引
struct HeadIndex
{
	char name[50];  //文件名
	short PMS;   //权限
	short sects[SECT_MAX];
	short type;  //文件类型
	short size;  //文件总块数
	long  modTime;   //上次修改时间
	short rdCnt; //读此文件的用户数
	short wrtCnt; //写此文件的用户数
	
};



//用户名及密码文件
struct User
{
	char name[20];
	char psd[17];
};


/////////////////////////////////////////////////////////////////
//
//						内存的数据结构
//	
////////////////////////////////////////////////////////////////


//内存中的打开文件表
struct MemoOpenFile
{
	 char name[50];
	 short sectMemo[SECT_MAX][2];  //外存的块号以及内存号
	 short access; //访问位
	 short mod;    //修改位  0为未修改 1为脏数据
	 short loadType; //打开方式
	 short size;   //文件的总块数
	 short type;   //文件类型
 //        char terName[20];
};


//zone
struct Zone
{
    int openedSize;
    int openedSum;
    BaseSect baseMemo;
    MemoOpenFile openFileMemo[OPEN_MAX];
    char strMemo[STRMEMO_MAX][CONTENT_MAX];  
};





////////////////////////////////////////////////////////////////
//
//						       函数声明
//
////////////////////////////////////////////////////////////////


////////////////////////////////
//
//        FilePart.cpp
//
/////////////////////////////////
//extern BaseSect baseMemo;
//extern MemoOpenFile openFileMemo[OPEN_MAX];
//extern int openedSize;
//extern int openedSum;
//extern char strMemo[STRMEMO_MAX][CONTENT_MAX];
extern char MyName[20];
extern char MyPassword[17];
extern int MemoNum;

void HDformat();
void iniMemo();
void releaseMemoZone();
//int addUser(char*newName,long modTime);
void loadHeadIndex(HeadIndex *headIndex,char *terName);
void unloadHeadIndex(HeadIndex *headIndex,char *terName);
void getMemoZone(Zone *zone);
void putMemoZone(Zone *zone);
int loadToMemo(Zone *myZone, short sect, char *terName);
void unloadMemo(Zone *myZone, short memoNum);
void iniSect(int sect);
void writeBack(char *stream, short sect,char *terName);
void buildDir(char *strDir,char *filename,char* spms,char ctype,long modTime);
//int delUser(char *name);
int isExist(char *terName,int num);
char* SecterPath(char *filename,int num);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!需啊哟删除

/////////////////////////////
//
//     Functions.cpp
//
/////////////////////////////

int getVacSects(int sects[], int sectNumToGet, char *terName);
int getHeadNode(HeadIndex *headIndex,char *filename);
int getMemoNum(char *filename);
int delSects(int sects[], int sectNumToDel,char *terName);
int isSys(char *filename);
int isRemote(char *filename,char *terName,char *path);
void replaceContent(char *stream,int openNum);
void appendContent(char *stream,int openNum);
void addHead(HeadIndex *headIndex,char *filename,short pms,short sect,short type,short size,long modTime);
void delFileInDir(int dirOpenNum,char *file);
void showOpen();

//////////////////////////
//
//			Login.cpp
//
////////////////////////////

void login(char *name);
void registration();
//int addOnline(char *name);
//int delOnline(char *name);
//int onlyRoot();
//int addUserHead(char *newName,long modTime);
//int delUserHead(char *name);



//////////////////////////
//
//			BasicCmd.cpp
//
////////////////////////////


int loadFile(char *filename,short loadType);
int unloadFile(char *filename);
int deleteFile(char *filename);
int showFile(char *filename);
int editFile(char *filename);
int createFile(char *path,char *filename);


//////////////////////////
//
//			MD5Converter.cpp
//
////////////////////////////
void MD5Digest(char *pszInput, unsigned long nInputSize, char *pszOutPut);


